<?php

/*
 * CopyRight  : (C)2012-2099 HaoTeam Inc.
 * Document   : Wechat.php
 * Created on : 2022-12-30 15:03:40
 * Author     : Tiger <1192851302@qq.com>
 * Description: This is NOT a freeware, use is subject to license terms.
 *              这即使是一个免费软件,使用时也请遵守许可证条款,得到当时人书面许可.
 *              未经书面许可,不得翻版,翻版必究;版权归属 HaoTeam Inc;
 */

namespace app\api\controller\easypay;

use app\Request;
use haoteam\service\EasyPayService;
use app\models\Payment;
use app\models\Refunds;
use Yansongda\Pay\Log;

/**
 * 
 * Class Wechat
 * Tiger <1192851302@qq.com> 2022-12-30 15:03:40
 */
class Wechat {

    /**
     * 支付回调
     * @author Tiger <1192851302@qq.com>
     * @param type $mid
     */
    public function payment() {
        $wechat = EasyPayService::wechat();
        try {
            $message = $wechat->verify(); // 是的，验签就这么简单！
            Log::debug('Wechat notify', $message->all());
            // 请自行对 trade_status 进行判断及其它逻辑进行判断，在支付宝的业务通知中，只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时，支付宝才会认定为买家付款成功。
            // 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号；
            // 2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额）；
            // 3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）；
            // 4、验证app_id是否为该商户本身。
            // 5、其它业务逻辑情况
            $payment = Payment::where('out_trade_no', $message['out_trade_no'])->where('status', 0)->field([
                        'id', 'join_id', 'attach', 'callback', 'callback_status', 'out_trade_no'
                    ])->find();
            if (empty($payment)) {
                return false;
            }
            try {
                //更新支付表
                Payment::update(['transaction_id' => $message['transaction_id'], 'status' => 1, 'pay_time' => date('Y-m-d H:i:s')], ['id' => $payment['id']]);
                //通知应用
                call_user_func_array(array("{$payment['callback']}", "paySuccess"), compact('message', 'payment'));
            } catch (\Exception $exc) {
                return false;
            }
        } catch (\Exception $e) {
            return false;
        }

        return $wechat->success()->send();
    }

}
